use std::ops::Range;

use rand::Rng;

fn gen_rand_num(rng:Range<i32>) -> impl Fn() -> i32 {
    let self_rng = rng.clone();
    // 使用 move 将变量的所有权转移到闭包中
    move || -> i32 {
        rand_num(self_rng.clone())
    }
}

fn rand_num(rng:Range<i32>) -> i32 {
    rand::thread_rng().gen_range(rng)
}

fn main() {
    // 生成一个闭包，该闭包每次调用时返回一个 -100 到 100 之间的随机数
    let fn_rand_num = gen_rand_num(-100..100);
    // 调用闭包，获取随机数
    let mut num:i32 = fn_rand_num();

    let max_num = rand::thread_rng().gen_range(0..10);
    let min_num = rand::thread_rng().gen_range(-10..0);

    println!("当随机生成的数 >= {} 且 <= {} 时结束", min_num,max_num);
    while num < min_num || num > max_num {
        println!("随机数为: {}", num);
        num = fn_rand_num();
    }

    println!("当随机生成的数 >={} 且 <= {}时结束", min_num,max_num);
    println!("最终的随机数为: {}", num);

    println!("{}", "=".repeat(50));

    // 使用 loop 实现 随机生成 5 次随机数并打印过程
    let mut counter = 0;
    let mut vec:Vec<i32> = vec!();
    let result = loop {
        counter += 1;
        num = fn_rand_num();
        vec.push(num);
        println!("随机数为: {}", num);
        if counter == 5 {
            // 可使用 break 退出循环并返回结果
            break num;
        }
    };
    println!("最终的随机数为: {}", result);

    println!("{}", "=".repeat(50));

    // for 循环遍历 vec 并打印
    for num in &vec {
        println!("vec 中的随机数为: {}", num);
    }

    println!("{}", "=".repeat(50));

    // 切片获取 vec 中最后两个元素
    let slice = &vec.as_slice()[vec.len()-2..vec.len()];
    for x in slice {
        println!("slice 中的元素为: {}", x);
    }
}
